package com.wbu.microserviceconsumermovie8001.controller;


import com.igeekhome.microservice.feign.UserFeignService;
import com.igeekhome.microservice.pojo.User;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.math.BigDecimal;
import java.util.List;

/**
 * 服务消费者：查询用户信息
 * @author yadonghe
 * @date 2020-02-21 10:39
 */
@RestController
@RequestMapping("/movie")
public class MovieController {

    /**
     * Spring提供的同步的HTTP请求执行工具 ，可以执行GET\POST\PUT\DELETE...
     */
    @Autowired
    private RestTemplate restTemplate;   //暂时没有用了

    @Autowired
    private UserFeignService userFeignService;  /*注入feign接口*/


    @RequestMapping("/get/user/{id}")
    //@HystrixCommand(fallbackMethod = "getUserFallBack")  //对本身超时、异常处理
    public User get(@PathVariable Long id) {
        //不需要自己编写service、mapper查询用户信息
        //http://localhost:8081/user/get/1
        //使用Java代码发起HTTP请求
        //Spring提供了RestTemplate 用于执行HTTP请求
        //参数：1.请求的URL地址 2.需要将接口返回值转换的类型

        //MICROSERVICE-PROVIDER-USER:通过服务名称进行访问
        //Ribbion会根据服务名称查找该服务下的所有可用实例（7001 7002 7003 ），从这些实例中根据负载均衡的算法进行访问
        //User user = restTemplate.getForObject("http://MICROSERVICE-PROVIDER-USER/user/get/"+id, User.class);

        //User user = restTemplate.getForObject("http://MICROSERVICE-PROVIDER-USER/user/get/{id}", User.class, id);

        /*
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
         */

        //int i = 10/0;
        return userFeignService.get(id);
    }

    //回退方法:参数、返回值需要与处理器方法一致
    public User getUserFallBack(Long id, Throwable throwable) {
        return new User(id, "请求异常,请稍后再试", throwable.getMessage(),0, new BigDecimal(0));
    }



    //指定回退方法：用于对异常、错误进行处理的方法

    /*
    @HystrixCommand(fallbackMethod = "getUserFallBack")
    @RequestMapping("/get/user/{id}")
    public User get(@PathVariable Long id) {
        //不需要自己编写service、mapper查询用户信息
        //http://localhost:8081/user/get/1
        //使用Java代码发起HTTP请求
        //Spring提供了RestTemplate 用于执行HTTP请求
        //参数：1.请求的URL地址 2.需要将接口返回值转换的类型

        //MICROSERVICE-PROVIDER-USER:通过服务名称进行访问
        //Ribbion会根据服务名称查找该服务下的所有可用实例（7001 7002 7003 ），从这些实例中根据负载均衡的算法进行访问
        //User user = restTemplate.getForObject("http://MICROSERVICE-PROVIDER-USER/user/get/"+id, User.class);

        //模拟异常
        int i = 10 / 0;

        //hystrix默认1s超时
        //hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 进行修改默认超时时间

        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }



        User user = restTemplate.getForObject("http://MICROSERVICE-PROVIDER-USER/user/get/{id}", User.class, id);


        return user;
    }



*/



    /*
    @RequestMapping("/list/user")
    public List<User> list(@PathVariable Long id) {
        //不需要自己编写service、mapper查询用户信息
        //http://localhost:8081/user/get/1
        //使用Java代码发起HTTP请求
        //Spring提供了RestTemplate 用于执行HTTP请求
        //参数：1.请求的URL地址 2.需要将接口返回值转换的类型

        //MICROSERVICE-PROVIDER-USER:通过服务名称进行访问
        //Ribbion会根据服务名称查找该服务下的所有可用实例（7001 7002 7003 ），从这些实例中根据负载均衡的算法进行访问
        List<User> user = restTemplate.getForObject("http://MICROSERVICE-PROVIDER-USER/user/get/"+id, List.class);
        return user;
    }
    */

}
